unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure AALine(x1,y1,x2,y2 : single; color : tcolor; canvas : tcanvas);
  function CrossFadeColor(FromColor,ToColor : TColor; Rate : Single) : TColor;
  var r,g,b : byte;
  begin
    r:=Round(GetRValue(FromColor)*Rate+GetRValue(ToColor)*(1-Rate));
    g:=Round(GetGValue(FromColor)*Rate+GetGValue(ToColor)*(1-Rate));
    b:=Round(GetBValue(FromColor)*Rate+GetBValue(ToColor)*(1-Rate));
    Result:=RGB(r,g,b);
  end;
  procedure hpixel(x : single; y : integer); 
  var FadeRate : single;
  begin
    FadeRate:=x-trunc(x);
    with canvas do
    begin
      pixels[trunc(x),y]:=CrossFadeColor(Color,Pixels[Trunc(x),y],1-FadeRate);
      pixels[trunc(x)+1,y]:=CrossFadeColor(Color,Pixels[Trunc(x)+1,y],FadeRate);
    end;
  end;

  procedure vpixel(x : integer; y : single);
  var FadeRate : single;
  begin
    FadeRate:=y-trunc(y);
    with canvas do
    begin
      pixels[x,trunc(y)]:=CrossFadeColor(Color,Pixels[x,Trunc(y)],1-FadeRate);
      pixels[x,trunc(y)+1]:=CrossFadeColor(Color,Pixels[x,Trunc(y)+1],FadeRate);
    end;
  end;

var i : integer; 
    ly,lx,currentx,currenty,deltax,deltay,l,skipl : single; 
begin
  if (x1<>x2) or (y1<>y2) then
  begin 
    currentx:=x1; 
    currenty:=y1; 
    lx:=abs(x2-x1); 
    ly:=abs(y2-y1); 

    if lx>ly then
    begin 
      l:=trunc(lx); 
      deltay:=(y2-y1)/l; 
      if x1>x2 then
      begin
        deltax:=-1; 
        skipl:=(currentx-trunc(currentx));
      end else 
      begin 
        deltax:=1; 
        skipl:=1-(currentx-trunc(currentx)); 
      end; 
    end else
    begin 
      l:=trunc(ly); 
      deltax:=(x2-x1)/l; 
      if y1>y2 then
      begin 
        deltay:=-1; 
        skipl:=(currenty-trunc(currenty)); 
      end else 
      begin 
        deltay:=1; 
        skipl:=1-(currenty-trunc(currenty)); 
      end;
    end;

    currentx:=currentx+deltax*skipl;
    currenty:=currenty+deltay*skipl;{}

    for i:=1 to trunc(l) do
    begin
      if lx>ly then vpixel(trunc(currentx),currenty) else hpixel(currentx,trunc(currenty));
      currentx:=currentx+deltax;
      currenty:=currenty+deltay;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Canvas.Pen.Style := psDot;
//  Image1.Canvas.Brush.Style := bsFDiagonal;

  Image1.Canvas.Pen.Width :=1;

  Image1.Canvas.MoveTo(0,0);
  Image1.Canvas.LineTo(200,20);


  AALine(20,0,300,10,clBlack,Image1.Canvas);


end;

end.
